<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>预编译作业</title>
</head>

<body>
    <script>
        // 一、
        GO = {
            test:function test(a,b) {}
        }
        // 全局编译完成！！！

        function test(a, b) {
        AO = {
           // a:undefined//形参
           // a:undefined//变量
           // a: 1, //形参实参相统一
           a : function a() {}, //寻找函数并赋值函数体
           b:undefined, //变量提升
        }
        // 函数预编译完成！！！

            console.log(a);//f a() {}
            console.log(b);//undefined
            var b = 234;
            console.log(b); //234,就近原则
            a = 123;
            console.log(a); //123,就近原则

            function a() {}//已经预编译，当作不存在
            var a;//变量提升了
            b = 234;
            var b = function () {}//赋值操作
            console.log(a); //123
            console.log(b); //f () {}，就近原则
        }
        test(1);

        // 二、
        GO = {
            a:undefined,
        }
        //全局预编译完成！！

        a = 100;

        function demo(e) {
        AO = {
            // e:undefined//寻找形参实参，赋值undefined
            // e: 1, //形参实参相统一
            e:function e() {},//寻找函数并赋值函数体
            b:undefined, //变量提升 
            a:undefined, //变量提升
            c:undefined
        }
        //函数与解析编译完成！！！
        
            function e() {}
            arguments[0] = 2;//arguments[0]相当于形参e，所以下面输出的形参e就是这个值
            console.log(e); //2，就近原则
            if (a) {
                var b = 123;
            }
            var c;//提升
            a = 10;
            var a;//提升
            console.log(b);//undefined,因为if的条件不成立
            f = 123; 
            console.log(c); //undefined
            console.log(a); //10， window.a = 10，就近原则
        }
        var a;//提升
        demo(1);
        console.log(a);//100, window.a = 100 ，疑问：这里为什么不是10
        console.log(f);//123, window.f = 123

        // 三、
        GO = {
            global:undefined,
            fn:function fn() {}
        }
        // 全局编译结束！！！

        global = 100;
        function fn() {
        AO = {
            global:undefined, //变量提升
        }
        //函数变量编译结束
            console.log(global); //undefined,输出的是预编译里的global
            global = 200;
            console.log(global); //200，就近原则
            var global = 300;
        }
        fn();
        var global;

        // 四、
        GO = {
            a:function a() {}
        }
        //全局编译完成！！！

        function a(a) {
        AO = {
            // a:undefined, //var声明的变量提升
            // a:undefined, //形参赋值undefined
            // a:5,//形参实参相统一
            a:function a() {}, //寻找函数并赋值函数体
            d:undefined, //变量提升
            // c:undefined, //变量提升
            c:function c() {}, //寻找函数并赋值
            b:undefined //提升
        }
        //函数编译结束

            var d;
            var c;
            b = 10;
            var a;
            console.log(a);//function a() {}，输出的是编译里的a
            a = 123;

            function a() {}//已经预编译，相当于不存在
            console.log(a); //123
            var b;
            console.log(b); //10

            function c() {} 
            console.log(c); //function c() {}
            console.log(d); //undefined
            d = 100;
            console.log(d); //100
        }
        a(5);
    </script>
</body>

</html>